package thread;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * @author Han
 * 在完成一组正在其他线程中执行的操作之前，它允许一个或多个线程一直等待。
 *  很适合用来将一个任务分为n个独立的部分，等这些部分都完成后继续接下来的任务，CountDownLatch 只能出发一次，计数值不能被重置。
 */
public class CountDownLatchDemo {
	final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	public static void main(String[] args) throws InterruptedException {
		CountDownLatch latch = new CountDownLatch(3);// 两个工人的协作
		Worker worker1 = new Worker("zhang san", 1000, latch);
		Worker worker2 = new Worker("li si", 1000, latch);
		worker1.start();//
		worker2.start();//
		latch.await(25,TimeUnit.SECONDS);
		System.out.println("all work done at " + sdf.format(new Date()));
		Worker worker4 = new Worker("a", 5000, latch);
		Worker worker5 = new Worker("b", 8000, latch);
		worker4.start();
		worker5.start();
		//这里整个不好使了。
		latch.await();
		System.out.println("all work done at " + sdf.format(new Date()));
	}

	static class Worker extends Thread {
		String workerName;
		int workTime;
		CountDownLatch latch;

		public Worker(String workerName, int workTime, CountDownLatch latch) {
			this.workerName = workerName;
			this.workTime = workTime;
			this.latch = latch;
		}

		public void run() {
			System.out.println("Worker " + workerName + " do work begin at " + sdf.format(new Date()));
			doWork();// 工作了
			System.out.println("Worker " + workerName + " do work complete at " + sdf.format(new Date()));
			latch.countDown();// 工人完成工作，计数器减一
			latch.countDown();// 工人完成工作，计数器减一
		}

		private void doWork() {
			try {
				Thread.sleep(workTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	static class MyThread extends Thread{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("running...");
		}
	}

}


